//
// Created by Administrator on 2018/11/30.
//

#include <iconv.h>
#include <log.h>
#include <cstring>

/* 字符转换
*@param encTo        目的编码,示例："UNICODE//TRANSLIT"、"UNICODE//IGNORE"
                     示例中的TRANSLIT：遇到无法转换的字符就找相近字符替换，IGNORE  ：遇到无法转换字符跳过
*@param encFrom      源编码
*@param srcstart     需要转换的字符串
*@param inlen        需要转换的字符串的字符串长度
*@param tempoutbuf   存放转换后的字符串
*@param outlen       存放转换后字符串的长度
*
* */
int iconv_cd(const char *encTo, const char *encFrom, const char *inbuf, size_t inlen, char *outbuf,
              size_t outlen){
/* 获得转换句柄
   *@param encTo 目标编码方式
   *@param encFrom 源编码方式
   *
   * */
    iconv_t cd = iconv_open (encTo, encFrom);
    if (cd == (iconv_t)-1)
    {
        LOGD ("iconv_open err");
        return -1;
    }

    char tmpin[inlen];
    memcpy(tmpin,inbuf,inlen);
    char* p_tmpin = tmpin;
    char tmpout[outlen];
    memcpy(tmpout,outbuf,outlen);
    char* p_tmpout = tmpout;
    size_t tmp_outlen = outlen;

    /* 进行转换
     *@param cd iconv_open()产生的句柄
     *@param srcstart 需要转换的字符串
     *@param inlen 存放还有多少字符没有转换
     *@param tempoutbuf 存放转换后的字符串
     *@param outlen 存放转换后,tempoutbuf剩余的空间
     *
     * */
    size_t ret = iconv (cd, &p_tmpin, &inlen, &p_tmpout, &outlen);
    if (ret == -1)
    {
        LOGD ("iconv err");
        return -1;
    }

    /* 关闭句柄 */
    iconv_close (cd);

    memcpy(outbuf,tmpout,tmp_outlen-outlen);

    return tmp_outlen-outlen;
}